﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;
using DTO;

namespace Persistence
{
    public class TeacherController : PersonController
    {
        //Inserta un nuevo docente.
        public static long insertTeacher(Teacher teacher)
        {
            //Se le envia al metodo insertPerson como parametro, la instancia de Persona
            //y el nombre del procedimiento almacenado que se desea usar.
            MySqlCommand comm = insertPerson(teacher, "proin_AT");

            MySqlParameter outIdParam = new MySqlParameter("@vId", MySqlDbType.Int16)
            {
                Direction = ParameterDirection.Output
            };
            comm.Parameters.AddWithValue("@pusername", truncate(teacher.StrUserName, 40));
            comm.Parameters.AddWithValue("@ppassword", truncate(teacher.StrPassword, 40));
            comm.Parameters.AddWithValue("@pusertype", "Teacher");
            comm.Parameters.Add(outIdParam);

            //Se ejecuta el comando.
            DBConnection.getInstance().executeNonQueryCommand(comm);
            //Se devuelve el Id del docente creado.
            long id = long.Parse(outIdParam.Value.ToString());

            return id;
        }
        //Actualiza los datos de un docente.
        public static void updateTeacher(Teacher pUpdated)
        {
           
            //Se obtiene la version antigua de los datos del docente a actualizar.
            Teacher pOriginal = getTeacherById(pUpdated.LngId);
            //Se actualizan los datos generales.
            updatePerson(pOriginal, pUpdated);

            //Se actualizan los datos especificos de la clase Teacher.
            if (!pUpdated.StrUserName.Equals(pOriginal.StrUserName))
            {
                Helper.updateProperty("users", "ususername", pUpdated.StrUserName, "usid", pOriginal.LngId, 40);
            }
            if (pUpdated.StrPassword != null && !pUpdated.StrPassword.Equals(pOriginal.StrPassword))
            {
                Helper.updateProperty("users", "uspassword", pUpdated.StrPassword, "usid", pOriginal.LngId, 40);
            }
        }

        //Da baja logica a un docente en el sistema.
        public static void deleteTeacher(long vId)
        {
            deletePerson(vId, "Teacher");
        }

        //Obtiene una lista de los docentes registrados y activos coincidentes con el criterio de busqueda.
        public static DataTable getTeacherListBySearch(string vSearch)
        {
            DBConnection dbConn = DBConnection.getInstance();
            MySqlCommand cmd = dbConn.createCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "proout_ListAT";
            cmd.Parameters.AddWithValue("@ptypeuser", "Teacher");
            cmd.Parameters.AddWithValue("@psearch", vSearch);

            DataTable dt = dbConn.executeSelectCommand(cmd);
            return dt;
        }

        //Obtiene una instancia de Teacher con los datos correspondientes al Id ingresado como parametro.
        public static Teacher getTeacherById(long vId)
        {
            //Se obtienen los datos generales del docente.
            Teacher te = new Teacher();
            te = (Teacher)PersonController.getPersonById(vId, te);

            //Se obtienen los datos especificos de la clase Teacher.
            string sql = "SELECT ususername, uspassword FROM  users WHERE usid = @id;";
            MySqlCommand comm = DBConnection.getInstance().createCommand();
            comm.CommandText = sql;
            comm.Parameters.AddWithValue("id", Convert.ToInt16(vId));
            DataTable dt = DBConnection.getInstance().executeSelectCommand(comm);
            //Se asignan los datos obtenidos a la instancia de Teacher creada.
            te.StrUserName = dt.Rows[0]["ususername"].ToString();
            te.StrPassword = dt.Rows[0]["uspassword"].ToString();
            //Se retorna el docente.
            return te;
        }

        private static string truncate(string unSt, int maxLength)
        {
            return unSt.Length <= maxLength ? unSt : unSt.Substring(0, maxLength);
        } 
    }
}
